//
//  APIRequestManager.m
//  ProjectDemo
//
//  Created by IOS3 on 2018/10/23.
//  Copyright © 2018 IOS3. All rights reserved.
//

#import "APIRequestManager.h"


@interface APIRequestManager ()

@property (nonatomic, strong) AFHTTPSessionManager *defaultManager;
@property (nonatomic, strong) AFHTTPSessionManager *uploadManager;

@end


@implementation APIRequestManager

+ (instancetype)sharedInstance {
    static APIRequestManager *instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[APIRequestManager alloc] init];
        
        // 一个 baseURL 初始化一个 AFHTTPSessionManager 单例
        instance.defaultManager = [self initializeDefaultRequestSessionManager];
        
        // 上传 使用的 AFHTTPSessionManager
        instance.uploadManager = [self initializeUploadRequestSessionManager];
    });
    return instance;
}


- (AFHTTPSessionManager *)sessionManagerWith:(BaseURLType)type {
    switch (type) {
        case BaseURLType_default:
            return self.defaultManager;
            break;
        case BaseURLType_upload:
            return self.uploadManager;
            break;
            
        default:
            return nil;
            break;
    }
}

// 初始化 默认 baseURL 的 AFHTTPSessionManager
+ (AFHTTPSessionManager *)initializeDefaultRequestSessionManager {
    
    NSURL *baseURL = [NSURL URLWithString:DEFAULT_BASE_URL];
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL];
    // AFHTTPRequestSerializer (二进制), AFJSONRequestSerializer (JSON), AFPropertyListRequestSerializer(PList, 一种XML)
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    // 超时时间
    manager.requestSerializer.timeoutInterval = 30.0f;
    // 设置请求头
    // [manager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
    
    // 返回格式
    // AFHTTPResponseSerializer           二进制格式
    // AFJSONResponseSerializer           JSON
    // AFXMLParserResponseSerializer      XML,只能返回XMLParser,还需要自己通过代理方法解析
    // AFXMLDocumentResponseSerializer (Mac OS X)
    // AFPropertyListResponseSerializer   PList
    // AFImageResponseSerializer          Image
    // AFCompoundResponseSerializer       组合
    manager.responseSerializer = [AFJSONResponseSerializer serializer];//返回格式 JSON
    
    //设置可接收的数据类型 content-type
    NSMutableSet *acceptableContentTypes = [NSMutableSet setWithSet:manager.responseSerializer.acceptableContentTypes];
    [acceptableContentTypes addObjectsFromArray:@[@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/plain", @"application/xml", @"text/xml", @"*/*", @"application/x-plist"]];
    manager.responseSerializer.acceptableContentTypes = [acceptableContentTypes copy];
    
    // 记录网络状态
    [manager.reachabilityManager startMonitoring];
    
    // 设置 HTTPS 证书
    /*
    NSString *cerFilePath = @"";
    // 先导入证书 证书由服务端生成，具体由服务端人员操作
    // NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];//证书的路径
    NSData *cerData = [NSData dataWithContentsOfFile:cerFilePath];
    
    // AFSSLPinningModeCertificate 使用证书验证模式
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    // allowInvalidCertificates 是否允许无效证书（也就是自建的证书），默认为NO
    // 如果是需要验证自建证书，需要设置为YES
    securityPolicy.allowInvalidCertificates = YES;
    
    //validatesDomainName 是否需要验证域名，默认为YES;
    //假如证书的域名与你请求的域名不一致，需把该项设置为NO；如设成NO的话，即服务器使用其他可信任机构颁发的证书，也可以建立连接，这个非常危险，建议打开。
    //置为NO，主要用于这种情况：客户端请求的是子域名，而证书上的是另外一个域名。因为SSL证书上的域名是独立的，假如证书上注册的域名是www.google.com，那么mail.google.com是无法验证通过的；当然，有钱可以注册通配符的域名*.google.com，但这个还是比较贵的。
    //如置为NO，建议自己添加对应域名的校验逻辑。
    securityPolicy.validatesDomainName = NO;
    
    securityPolicy.pinnedCertificates = [[NSSet alloc] initWithObjects:cerData, nil];
    
    // 2.加上这个函数，https ssl 验证。
    [manager setSecurityPolicy:securityPolicy];
     */
    return manager;
}


// 初始化 默认 upload URL 的 AFHTTPSessionManager
+ (AFHTTPSessionManager *)initializeUploadRequestSessionManager {
    
    NSURL *baseURL = [NSURL URLWithString:DEFAULT_BASE_URL];
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];//返回格式 JSON
    
    //设置可接收的数据类型 content-type
    NSMutableSet *acceptableContentTypes = [NSMutableSet setWithSet:manager.responseSerializer.acceptableContentTypes];
    [acceptableContentTypes addObjectsFromArray:@[@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/plain", @"application/xml", @"text/xml", @"*/*", @"application/x-plist"]];
    manager.responseSerializer.acceptableContentTypes = [acceptableContentTypes copy];
    
    [manager.reachabilityManager startMonitoring];
    
    return manager;
}


@end
